<?php
/**
 * @version      BOSSCMS-Free
 * @trademark    BOSSCMS
 * @copyright    Copyright © by BOSSCMS-Free (https://www.bosscms.net/) 保留所有权利
 * @license      https://gitee.com/Greenpeas/BOSSCMS/license/ 和 https://www.bosscms.net/freelicense/
 * @link         https://www.bosscms.net/
 * @author       温州软界网络技术有限公司
**/
defined('IS_OK') or exit('Access Forbidden');

into::basic_json('extension');

class upload{
	
	public static $msg = '上传失败';
	public static $path = '';
	public static $maxsize = null;
	public static $extension = null;
	public static $relative = null;
	
	/**  
	 * 文件上传
	 *
	 * @param array $file 前台通过http post上传来的$_FILES数据
	 * @param strong $path 保存文件的文件夹，为空则保存在根目录upload的对应文件夹中
	 * @param strong $type 允许上传的文件类型，为空则支持系统设置的所有类型
	 * @return boolean
	 */
	public static function files($file, $path=null, $type=null){
		global $G;
		if(!isset(self::$maxsize)){
			self::$maxsize = $G['config']['upload_maxsize']*1024*1024;
		}
		if(!isset(self::$extension)){
			self::$extension = json::decode($G['config']['upload_extension']);
		}
		if(is_uploaded_file($file['tmp_name'])){
			if($file['error']==0){
				$ext = '.'.strtolower(pathinfo($file['name'],PATHINFO_EXTENSION));
				if(in_array($ext,$G['extension']['photo']) && !getimagesize($file['tmp_name'])){
					self::$msg = '上传文件不是有效的图片';
					return false;
				}
				$in = false;
				if($type){
					$tarr = explode('|',$type);
					foreach($G['extension'] as $k=>$v){
						if(in_array($ext, $v)){
							if(in_array($k, $tarr)){
								$type = null;
								break;
							}
							$in = true;
						}
					}
				}
				if(preg_match('/^\.[A-Za-z0-9]+$/i',$ext) && !preg_match('/^\.(php\d*|aspx*|jsp*)$/i',$ext) && in_array($ext,self::$extension) && (!$type||!$in)){
					if($file['size'] <= self::$maxsize){
						if(move_uploaded_file($file['tmp_name'], $path=self::path($file['name'],$path))){
							if(preg_match('/^\.(png|jpg|jpeg|gif)$/i',$ext) && arrExist($G['config'],'watermark_open') && ($class=into::load_class('plugin','watermark','waterimg','new'))){
								if($data = $class->set($path)){
									file_put_contents(ROOT_PATH.self::$path, $data);
								}
							}
							if(isset(self::$relative)){
								self::$path = self::$relative.self::$path;
							}else{
								self::$path = url::relative().self::$path;
							}
							self::$msg = '上传成功';
							return true;
						}else{
							self::$msg = '上传失败';
						}
					}else{
						self::$msg = '上传文件超过最大文件限制';
					}
				}else{
					self::$msg = '该文件扩展名不允许上传';
				}				
			}else{
				switch($file['error']){
					case 1: self::$msg = '超过服务器的“php.ini”所设置允许上传文件的大小';
					case 2: self::$msg = '超过“MAX_FILE_SIZE”允许上传的大小';
					case 3: self::$msg = '文件已部分上传';
					case 4: self::$msg = '没有上传文件';
					case 5: self::$msg = '文件大小为0';
				}
			}
		}else{
			self::$msg = '没有上传文件';
		}
		return false;
	}

	/**
	 * 文件上传地址
	 *
	 * @param strong $name 上传的文件名称，可设置是否重命名文件
	 * @param strong $path 保存文件的文件夹，为空则保存在根目录upload的对应文件夹中 boss cms（路径必须为根目录下文件相对路径）
	 * @return strong
	 */	
	public static function path($name, $path=null, $exist=0){
		global $G;
		$ext = '.'.strtolower(pathinfo($name,PATHINFO_EXTENSION));
		$name = date('dHis',TIME).mt_rand(0,9).$ext;
		$Ym = date('Ym',TIME);
		if($path){
			$dir = $path.'/'.(strpos($path,'upload/')===0?$Ym.'/':'');
			dir::make(ROOT_PATH.$dir);
		}else{
			$upload = 'upload/';
			$dir = $upload.self::dirname($ext,'file').'/'.$Ym.'/';
			dir::make(ROOT_PATH.$dir);
		}
		$src = dir::replace(ROOT_PATH.$dir).strFilenameIconv($name);
		self::$path = dir::replace($dir).$name;
		if(is_file($src) && $exist<9){
			sleep(1);
			return self::path($name, $path, $exist++);
		}else{
			return $src;
		}
	}

	/**
	 * 归类文件夹
	 * @param strong $ext 文件类型
	 * @param strong $def 没有结果时的默认目录名称
	 * @return strong
	 */
	public static function dirname($ext, $def=''){
		global $G;
		foreach($G['extension'] as $k=>$v){
			if(in_array($ext, $v)){
				return $k;
			}
		}
		return $def;
	}
}
?>